/*
 * TICPY Framework
 * Copyright (C) 2012 Plan Director TICs
 *
----------------------------------------------------------------------------
 * Originally developed by SERPRO
 * Demoiselle Framework
 * Copyright (C) 2010 SERPRO
 *
----------------------------------------------------------------------------
 * This file is part of TICPY Framework.
 *
 * TICPY Framework is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License version 3
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License version 3
 * along with this program; if not,  see <http://www.gnu.org/licenses/>
 * or write to the Free Software Foundation, Inc., 51 Franklin Street,
 * Fifth Floor, Boston, MA  02110-1301, USA.
 *
----------------------------------------------------------------------------
 * Este archivo es parte del Framework TICPY.
 *
 * El TICPY Framework es software libre; Usted puede redistribuirlo y/o
 * modificarlo bajo los términos de la GNU Lesser General Public Licence versión 3
 * de la Free Software Foundation.
 *
 * Este programa es distribuido con la esperanza que sea de utilidad,
 * pero sin NINGUNA GARANTÍA; sin una garantía implícita de ADECUACION a cualquier
 * MERCADO o APLICACION EN PARTICULAR. vea la GNU General Public Licence
 * más detalles.
 *
 * Usted deberá haber recibido una copia de la GNU Lesser General Public Licence versión 3
 * "LICENCA.txt", junto con este programa; en caso que no, acceda a <http://www.gnu.org/licenses/>
 * o escriba a la Free Software Foundation (FSF) Inc.,
 * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
 */

package py.org.financiero.view;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import org.ticpy.tekoporu.annotation.NextView;
import org.ticpy.tekoporu.annotation.PreviousView;
import org.ticpy.tekoporu.stereotype.ViewController;
import org.ticpy.tekoporu.template.AbstractListPageBean;
import org.ticpy.tekoporu.transaction.Transactional;

import py.org.financiero.business.UsuarioPermisoBC;
import py.org.financiero.domain.UsuarioPermiso;
import py.org.financiero.util.UsuarioUtils;

@ViewController
@NextView("/admin/usuarioPermiso_edit.xhtml")
@PreviousView("/admin/usuarioPermiso_list.xhtml")
public class UsuarioPermisoListMB extends AbstractListPageBean<UsuarioPermiso, Integer>{

	private static final long serialVersionUID = 1L;
	@Inject
	private UsuarioPermisoBC bc;
	private LazyDataModel<UsuarioPermiso> model;	
	private int pageSize = 11;
	private UsuarioPermiso usuarioPermiso;
	
	@Inject
	UsuarioUtils usuario;

	//Se obtiene el archivo de mensajes
	FacesContext ctx = FacesContext.getCurrentInstance();
	Locale locale = ctx.getViewRoot().getLocale();
	ResourceBundle mensajes = (ResourceBundle) ResourceBundle.getBundle("messages", locale);
	
	/**
	 * Carga la lista de usuarioPermiso
	 */
	@SuppressWarnings("serial")
	@PostConstruct
	public void loadLazyModel() {
		model = new LazyDataModel<UsuarioPermiso>() {
			
			@Override
			public List<UsuarioPermiso> load(int first, int pageSize, String sortField,
					SortOrder sortOrder, Map<String, String> filters) {
					
					if(sortField == null) sortField = "id"; //default sort field
					
					List<UsuarioPermiso> usuarioPermisoes = new ArrayList<UsuarioPermiso>();
					usuarioPermisoes = bc.findPage(pageSize, first, sortField, sortOrder.equals(SortOrder.ASCENDING)? true: false);
					
					//Aplicar filtro sobre el listado
					List<UsuarioPermiso> filtrados = new ArrayList<UsuarioPermiso>();
					if(filters != null){
						for(UsuarioPermiso usuarioPermiso : usuarioPermisoes) {
				            boolean match = true;
				 
				            if (filters != null) {
				                for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
				                    try {
				                        String filterProperty = it.next();
				                        Object filterValue = filters.get(filterProperty);
				                        Field field = usuarioPermiso.getClass().getDeclaredField(filterProperty);
				                        field.setAccessible(true);
				                        String fieldValue = String.valueOf(field.get(usuarioPermiso));
		                        
				                        if(filterValue == null || fieldValue.toLowerCase().contains(filterValue.toString().toLowerCase())) {
				                            match = true;
				                    }
				                    else {
				                            match = false;
				                            break;
				                        }
				                    } catch(Exception e) {
				                        match = false;
				                    }
				                }
				            }
				 
				            if(match) {
				                filtrados.add(usuarioPermiso);
				            }
				        }
						return filtrados;
					}
					return usuarioPermisoes;
			}
			
		};
	
		model.setRowCount(bc.count());
		model.setPageSize(pageSize);
	}
	

	public LazyDataModel<UsuarioPermiso> getModel() {
	    return model;
	}
	
	public int getPageSize() {
		
		return this.pageSize;
		
	}


	@Override
	protected List<UsuarioPermiso> handleResultList() {
		// TODO Auto-generated method stub
		return null;
	}
	
	/**
	 * Eliminar usuarioPermisoes a partir de la lista de checkbox
	 * @return pagina siguiente
	 */
	@Transactional
	public String deleteSelection() {
		boolean delete;
		boolean eliminado = false;
		for (Iterator<Integer> iter = getSelection().keySet().iterator(); iter.hasNext();) {
			Integer id = iter.next();
			delete = getSelection().get(id);

			if (delete) {
				//UsuarioPermiso usuarioPermiso = bc.load(id);
				this.bc.delete(id);
				//this.bc.update(usuarioPermiso);
				iter.remove();
				eliminado = true;
			}
		}
		if(eliminado){
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, mensajes.getString("eliminado.exito"), null);  
	        FacesContext.getCurrentInstance().addMessage("suceso", msg);
		}else{
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN, mensajes.getString("seleccionar.uno"), null);  
	        FacesContext.getCurrentInstance().addMessage("suceso", msg);
		}
		return getPreviousView();
	}
	
	/**
	 * Elimina un usuarioPermiso individualmente a partir del click en el icono de borrado
	 * @return pagina siguiente
	 */
	@Transactional
	public String eliminar(){
		if(usuarioPermiso != null && usuarioPermiso.getId()!= null){
			this.bc.delete(usuarioPermiso.getId());
			//this.bc.update(usuarioPermiso);
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, mensajes.getString("eliminado.exito"), null);  
	        FacesContext.getCurrentInstance().addMessage("suceso", msg);	        
		}
		return getPreviousView();
	}

	public UsuarioPermiso getUsuarioPermiso() {
		return usuarioPermiso;
	}


	public void setUsuarioPermiso(UsuarioPermiso usuarioPermiso) {
		this.usuarioPermiso = usuarioPermiso;
	}

}
